﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Media;

namespace App
{

    public enum Audio { 
        BOIA,
        ANZOL
    }

    //TODO incluir barra de progresso
    public partial class Principal : Form
    {
        
        private const int tempoLancamentoMlseg = 11900;
        private const int qntAnzoisPorSambura = 7;
        private const int qntSamburas = 143;
        private const int distMateriais = 43;//metros

        private const String msgLancamento0 = "Preparar...";
        private const String msgLancamento1 = "Cabo + Bóia Rádio + Bóia Rígida";
        private const String msgLancamento2 = "1 Cabo + Bóia Bala";
        private const String msgLancamento3 = "1 Cabo + Bóia Rígida";
        private const String msgLancamento4 = "Anzol";
        private const String msgLancamento5 = "Anzol + LightStick";
        private const String msgPausa = "Pausa";
        private const String msgRetorno = "Retorno";
        private const String msgBtPausar = "PAUSAR";
        private const String msgBtContinuar = "CONTINUAR";
        private const String msgVazio = "";
        private const double milisegundoInicial = 1.0;

        private Boolean boiaBala = true;
        private Boolean anzolBoolean = true;
        private SoundPlayer myPlayer;
        private Boolean pause = false;
        private int contadorLancamentoMateriais = 0;
        private int contadorSambura = 1;
        private int contadorAnzol = 0;
        private double milisegundo = milisegundoInicial;
        

        public Principal()
        {
            InitializeComponent();
            myPlayer = new SoundPlayer();
            tempoLancamento.Interval = tempoLancamentoMlseg; //tempo de lancamento de cada material
        }



        #region TEMPORIZADORES ==============================================================================
            private void tempoLancamento_Tick(object sender, EventArgs e) {
                //finaliza
                if (qntSamburas == contadorSambura)
                {
                    this.parar();
                }

                //TODO MELHORAR DEFINICAO DE LANCAMENTO DE BOIA RADIO (remover posicoes estaticas)
                if (contadorLancamentoMateriais == 0 || contadorLancamentoMateriais == 592 || contadorLancamentoMateriais == 1184)
                {
                    contadorLancamentoMateriais++;
                    geraMensagem(msgLancamento1);
                    emiteSom(Audio.BOIA);
                }
                else
                {
                    //define lancamento de boia
                    if (contadorAnzol == qntAnzoisPorSambura)
                    {
                        if (boiaBala)
                        {
                            boiaBala = false;
                            contadorLancamentoMateriais++;
                            geraMensagem(msgLancamento2);
                            emiteSom(Audio.BOIA);
                        }
                        else
                        {
                            boiaBala = true;
                            contadorLancamentoMateriais++;
                            geraMensagem(msgLancamento3);
                            emiteSom(Audio.BOIA);
                        }
                        contadorAnzol = 0;
                        contadorSambura++;
                    }
                    else
                    {
                        //define lancamento de anzol
                        if (anzolBoolean)
                        {
                            contadorLancamentoMateriais++;
                            contadorAnzol++;
                            anzolBoolean = false;
                            geraMensagem(msgLancamento4);
                            emiteSom(Audio.ANZOL);
                        }
                        else
                        {
                            contadorLancamentoMateriais++;
                            contadorAnzol++;
                            anzolBoolean = true;
                            geraMensagem(msgLancamento5);
                            emiteSom(Audio.ANZOL);
                        }
                    }
                }
                milisegundo = milisegundoInicial; //zera cronometro
            }

            private void cronometro_Tick(object sender, EventArgs e)
            {
                milisegundo+=0.1;
                this.lblCronometro.Text = Math.Round(milisegundo,1).ToString(); 
            }

        #endregion


        #region METODOS ==============================================================================
            private void emiteSom(Audio audio)
            {
                if (audio.Equals(Audio.BOIA))
                {
                    myPlayer.Stream = Properties.Resources.boias;
                    myPlayer.Play();
                }
                if (audio.Equals(Audio.ANZOL))
                {
                    myPlayer.Stream = Properties.Resources.anzol;
                    myPlayer.Play();
                }
            }

            //TODO criar metodo de geracao de mensagem
            private void geraMensagem(String msg)
            {
                int linha = contadorLancamentoMateriais - 1;
                lbMsg.Text = msg;
  
                if (msg.Equals(msgLancamento4) || msg.Equals(msgLancamento5))
                {
                    dtSequenciaLancamento.Rows.Add(contadorLancamentoMateriais, contadorSambura, msg);
                    dtSequenciaLancamento.Rows[linha].DefaultCellStyle.BackColor = Color.WhiteSmoke;
                }
                else
                {
                    dtSequenciaLancamento.Rows.Add(contadorLancamentoMateriais, "", msg);
                    dtSequenciaLancamento.Rows[linha].DefaultCellStyle.BackColor = Color.Orange;
                }
                dtSequenciaLancamento.Sort(this.numero, ListSortDirection.Descending); //ordenar o datagrid
            }
        
            private void parar()
            {
                tempoLancamento.Enabled = false;
                cronometro.Enabled = false;
                btIniciar.Enabled = true;
                btParar.Enabled = false;
                btPause.Enabled = false;
                contadorLancamentoMateriais = 0;
                contadorSambura = 1;
                boiaBala = true;
                lbMsg.Text = msgVazio;
                anzolBoolean = true;
                milisegundo = milisegundoInicial;
            }

            
            private void pausar() {
                if (this.pause)
                {
                    lbMsg.Text = msgPausa;
                    this.btPause.Text = msgBtContinuar;
                    tempoLancamento.Enabled = false;
                    cronometro.Enabled = false;
                }
                else {
                    //mensagem.AppendLine(msgRetorno);
                    //tbListaMensagens.Text = msgVazio;
                    //tbListaMensagens.Text += mensagem;
                    this.btPause.Text = msgBtPausar;
                    tempoLancamento.Enabled = true;
                    cronometro.Enabled = true;
                    
                }
            }
        #endregion

        #region EVENTOS =============================================================================

            private void btIniciar_Click(object sender, EventArgs e)
            {
                //preparar
                lbMsg.Text = msgLancamento0;
                //inicia temporizador
                tempoLancamento.Start();
                cronometro.Start();
                //desabilita botoes de iniciar e habilita botao de parar e pausar
                btIniciar.Enabled = false;
                btConfig.Enabled = false;
                btParar.Enabled = true;
                btPause.Enabled = true;
            }

            private void btConfig_Click(object sender, EventArgs e)
            {
                new formConfiguracao().Show();
            }

            private void btSair_Click(object sender, EventArgs e)
            {
                this.Close();
            }

            private void btParar_Click(object sender, EventArgs e)
            {
                this.parar();
            }

            private void btPause_Click(object sender, EventArgs e)
            {
                if (this.pause)
                {
                    this.pause = false;
                }
                else {
                    this.pause = true;
                }
                this.pausar();
            }
        #endregion

      

    }
}
